package com.example.OnlineStorage.util;

import com.example.OnlineStorage.enums.Permissions;
import lombok.var;
import org.springframework.stereotype.Component;

@Component
public class PermissionsControl {
	
	
	/**
	 * 设置默认的管理权限：上传、删除、修改、下载
	 *
	 * @return 权限位
	 */
	public static Long controlPermissions () {
		var permissions = 0L;
		for (Permissions permission : Permissions.values()) {
			permissions = permissions | permission.getValue();
		}
		return permissions;
	}
	
	/**
	 * 设置默认的公共权限：下载、上传
	 *
	 * @return 权限位
	 */
	public static Long commonPermissions () {
		var permissions = 0L;
		permissions = permissions | Permissions.Share_files_Select.getValue();
		permissions = permissions | Permissions.Share_files_Insert.getValue();
		return permissions;
	}
	
	/**
	 * 验证是否有下载权限
	 *
	 * @param permissions 权限位
	 * @return true：有权限，false：无权限
	 */
	public static boolean isDownload (Long permissions) {
		return (permissions & Permissions.Share_files_Select.getValue()) > 0;
	}
	
	/**
	 * 验证是否有上传权限
	 *
	 * @param permissions 权限位
	 * @return true：有权限，false：无权限
	 */
	public static boolean isUpload (Long permissions) {
		return (permissions & Permissions.Share_files_Insert.getValue()) > 0;
	}
	
	/**
	 * 验证是否有修改权限
	 *
	 * @param permissions 权限位
	 * @return true：有权限，false：无权限
	 */
	public static boolean isUpdate (Long permissions) {
		return (permissions & Permissions.Share_files_Update.getValue()) > 0;
	}
	
	/**
	 * 验证是否有删除权限
	 *
	 * @param permissions 权限位
	 * @return true：有权限，false：无权限
	 */
	public static boolean isDelete (Long permissions) {
		return (permissions & Permissions.Share_files_Delete.getValue()) > 0;
	}
	
	/**
	 * 验证是否有所有权限
	 *
	 * @param permissions 权限位
	 * @return true：有权限，false：无权限
	 */
	public static boolean isAll (Long permissions) {
        for (Permissions permission : Permissions.values()) {
            if ((permissions & permission.getValue()) == 0) {
                return false;
            }
        }
		return true;
	}
    
    /**
     * 切换下载权限 如果有权限则删除权限，否则添加权限
     *
     * @param permissions 权限位
     * @return  新权限
     */
    public static Long reversedDownload (Long permissions) {
        return permissions ^ Permissions.Share_files_Select.getValue();
    }
    
    /**
     * 切换上传权限 如果有权限则删除权限，否则添加权限
     *
     * @param permissions 权限位
     * @return   新权限
     */
    public static Long reversedUpload (Long permissions) {
        return permissions ^ Permissions.Share_files_Insert.getValue();
    }
    
    /**
     * 切换修改权限 如果有权限则删除权限，否则添加权限
     *
     * @param permissions 权限位
     * @return   新权限
     */
    public static Long reversedUpdate (Long permissions) {
        return permissions ^ Permissions.Share_files_Update.getValue();
    }
    
    /**
     * 切换删除权限 如果有权限则删除权限，否则添加权限
     *
     * @param permissions 权限位
     * @return   新权限
     */
    public static Long reversedDelete (Long permissions) {
        return permissions ^ Permissions.Share_files_Delete.getValue();
    }
    
}
